#include "iap.h"

/*******************************************************
    0x0800 0000 - 0x0800 17FF 为Bootloder空间    SIZE:6 K
    0x0800 1800 - 0x0801 FFFF 为APP空间          SIZE:58k
*******************************************************/
iapfun jump2app; //(?)

u16 iapbuf[1024]; //按2KByte合并接收到的数据，然后写入flash

//将程序写入到指定flash地址
void iap_write_appbin(u32 addr,u8 *buf,u32 len)
{
	u16 t;
	u16 i = 0;
	u16 temp;
	u32 fwaddr = addr;
	u8 *dfu = buf;
	
	for(t=0;t<len;t+=2)
	{
		//将8位数据合并为16位数据
		temp = (u16)dfu[1]<<8;
		temp += (u16)dfu[0];
		dfu += 2;
		
		iapbuf[i++] = temp; //将合并完成的16位数据储存在数组中
			
		if(i == 1024) //合并的数据填满iapbuf缓冲区后，开始写入falsh
		{
			i=0;
			FLASH_Write(fwaddr,iapbuf,1024);
			fwaddr += 2048;
		}
		
	}
	
	if(i)FLASH_Write(fwaddr,iapbuf,i); //将最后一些内容写入flash

}

//执行flash里的app程序
void iap_load_app(u32 addr)
{
	if(((*(vu32*)addr) & 0x2FFE0000) == 0x20000000) //检查栈顶地址是否合法（？）
	{
		jump2app = (iapfun)*(vu32*)(addr + 4); //用户代码区第二个字为程序开始地址（复位地址）
		MSR_MSP(*(vu32*)addr); //初始化app栈顶指针（用户区的第一个字用于存放栈顶地址） 
		jump2app(); //跳转到APP
	}
}












